#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int a,b;
const int N=1e8+50;
bool vis[N];
vector<int> aa,bb;
typedef long long ll;
ll fun(ll n){
    return n*(n+1)/2;
}
int main(void){
    scanf("%d%d",&a,&b);
    //找到能装的最大的数
    int t=0;
    while(fun(t+1)<=a+b){
        t++;
    }
    for(int i=t;i>0;i--){
        if(a>=i){
            aa.push_back(i);
            a-=i;
            vis[i]=true;
        }
    }
    for(int i=1;i<=t;i++){
        if(!vis[i]){
            bb.push_back(i);
        }
    }
    printf("%d\n",int(aa.size()));
    if(aa.size()>0){
        for(int i=0;i<aa.size();i++){
            printf("%d ",aa[i]);
        }
        printf("\n");
    }
    printf("%d\n",int(bb.size()));
    if(bb.size()>0){
        for(int i=0;i<bb.size();i++){
            printf("%d ",bb[i]);
        }
        printf("\n");
    }
    return 0;
}